package com.ptl.bp.dto;

import com.ptl.bp.config.SensitiveData;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import javax.validation.constraints.*;
import java.util.List;

import static com.ptl.bp.config.DataAccessEnum.EU_COMMISSION;
import static com.ptl.bp.config.DataAccessEnum.RIGHT;

/**
 * 电池材料组成实体类
 * 描述：包含电池化学成分、关键原材料、正负极和电解质材料、有害物质等必填数据
 */
@Data
@Schema(description = "必填数据：电池化学成分；关键原材料；正极、负极和电解质中使用的材料；有害物质；物质对环境和人类健康或安全的影响")
public class BatteryMaterialComposition {

    // 有害物质分类枚举
    public enum HazardousSubstanceClass {
        @Schema(description = "急性毒性") AcuteToxicity,
        @Schema(description = "皮肤腐蚀或刺激") SkinCorrosionOrIrritation,
        @Schema(description = "眼睛损伤或刺激") EyeDamageOrIrritation
    }

    // 电池化学成分信息
    @Data
    @Schema(description = "电池化学成分信息")
    public static class ChemistryInfo {
        @NotBlank(message = "化学简称不能为空")
        @Schema(description = "电池化学简称", required = true)
        private String shortName;

        @NotBlank(message = "化学全称不能为空")
        @Schema(description = "电池化学全称", required = true)
        private String clearName;
    }

    // 电池组件位置信息
    @Data
    @Schema(description = "电池组件位置信息")
    public static class ComponentLocation {
        @NotBlank(message = "组件名称不能为空")
        @Schema(description = "包含材料的电池组件名称", required = true)
        private String componentName;

        @Schema(description = "组件ID")
        private String componentId;
    }

    @SensitiveData(hasAnyRole = {RIGHT, EU_COMMISSION})
    @NotEmpty(message = "电池材料列表不能为空")
    @Schema(description = "\"使用的组件材料\"（编号17.a-c）：根据公共标准命名正极、负极、电解质中的材料（作为物质的组成），包括相应组件（即正极、负极或电解质）的规格。我们建议报告阈值为0.1%（重量比）",required = true )
    private List<MaterialInfo> batteryMaterials;

    // 有害物质信息
    @Data
    @Schema(description = "有害物质信息")
    public static class HazardousSubstance {
        @NotNull(message = "有害物质分类不能为空")
        @Schema(
            description = "电池法规将报告范围缩小到符合CLP法规定义的危险类别和类别的物质",
            required = true
        )
        private HazardousSubstanceClass hazardousSubstanceClass;

        @NotBlank(message = "有害物质名称不能为空")
        @Schema(description = "有害物质的清晰名称", required = true)
        private String hazardousSubstanceName;

        @DecimalMin(value = "0", message = "有害物质浓度不能为负数")
        @Schema(description = "有害物质的浓度", required = true)
        private Double hazardousSubstanceConcentration;

        @NotEmpty(message = "有害物质影响不能为空")
        @Schema(
            description = "基于REACH或GHS的影响声明，适用于电池中物质的所有危险类别",
            required = true
        )
        private List<String> hazardousSubstanceImpact;

        @NotNull(message = "有害物质位置不能为空")
        @Schema(
            description = "有害物质（编号19-23）：所有有害物质在（子）组件级别的位置",
            required = true
        )
        private ComponentLocation hazardousSubstanceLocation;

        @Pattern(regexp = "^\\d{2,7}-\\d{2}-\\d{1}$", message = "有害物质标识符格式不正确")
        @Schema(description = "有害物质的CAS标识符", required = true)
        private String hazardousSubstanceIdentifier;
    }

    @NotNull(message = "电池化学成分不能为空")
    @Schema(description = "详细组成，包括正极、负极和电解质中使用的材料。所有常见电池都有两个电极和一个电解质。用于制造这些组件的特定材料组合称为\"化学\"。电池的化学性质在很大程度上决定了其特性，而其大部分变化是由添加剂、纯化和设计元素引起的",required = true )
    private ChemistryInfo batteryChemistry;

    // 电池材料信息
    @Data
    @Schema(description = "电池材料信息")
    public static class MaterialInfo {

        @NotNull(message = "材料位置信息不能为空")
        @Schema(description = "与材料相关的电池组件", required = true)
        private ComponentLocation batteryMaterialLocation;

        @Pattern(regexp = "^\\d{2,7}-\\d{2}-\\d{1}$", message = "材料标识符格式不正确")
        @Schema(description = "CAS编号", required = true)
        private String batteryMaterialIdentifier;

        @NotBlank(message = "材料名称不能为空")
        @Schema(description = "材料的清晰名称", required = true)
        private String batteryMaterialName;

        @DecimalMin(value = "0", message = "材料重量不能为负数")
        @Schema(description = "组件材料的重量", required = true)
        private Double batteryMaterialMass;

        @NotNull(message = "是否关键原材料不能为空")
        @Schema(
            description = "电池护照必须包含电池中存在的关键原材料信息。如果电池中关键原材料的浓度超过0.1%（重量比），则必须报告",
            required = true
        )
        private Boolean isCriticalRawMaterial;
    }

    @NotEmpty(message = "有害物质列表不能为空")
    @Schema(description = "\"有害物质\"（编号20.a-e）：名称（商定的物质命名法，例如IUPAC或化学名称）所有有害物质（作为\"任何对人类健康和环境构成威胁的物质\"）。建议在每个（子）组件中超过0.1%（重量比）时报告",required = true )
    private List<HazardousSubstance> hazardousSubstances;
}